package simpledb.execution;

import simpledb.storage.Tuple;

import java.io.Serializable;

/**
 * JoinPredicate 用于比较两个元组的字段，通常在 Join 操作中使用。
 * 它定义了一个谓词（条件），用于判断两个元组是否满足连接条件。
 */
public class JoinPredicate implements Serializable {

    private static final long serialVersionUID = 1L;

    // field1 是第一个元组中的字段索引
    private int               field1;

    // field2 是第二个元组中的字段索引
    private int               field2;

    // op 是要执行的比较操作，例如等于、大于等
    private Predicate.Op      op;

    /**
     * 构造函数：创建一个新的 JoinPredicate。
     *
     * @param field1 第一个元组中用于比较的字段索引
     * @param op 要使用的比较操作符（如 EQUAL, GREATER_THAN 等）
     * @param field2 第二个元组中用于比较的字段索引
     */
    public JoinPredicate(int field1, Predicate.Op op, int field2) {
        this.field1 = field1;
        this.field2 = field2;
        this.op = op;
    }

    /**
     * 对两个指定的元组应用当前的谓词条件进行过滤。
     *
     * @param t1 第一个元组
     * @param t2 第二个元组
     * @return 如果这两个元组满足当前谓词条件，则返回 true；否则返回 false
     */
    public boolean filter(Tuple t1, Tuple t2) {
        // 使用 Field 的 compare 方法来进行字段之间的比较
        return t1.getField(this.field1).compare(this.op, t2.getField(this.field2));
    }

    /**
     * 获取第一个元组中用于比较的字段索引。
     */
    public int getField1() {
        return this.field1;
    }

    /**
     * 获取第二个元组中用于比较的字段索引。
     */
    public int getField2() {
        return this.field2;
    }

    /**
     * 获取当前谓词中使用的比较操作符。
     */
    public Predicate.Op getOperator() {
        return this.op;
    }
}
